package cn.layfolk.uaa.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author Daimao
 * @date 安全配置类
 */
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    //认证管理器
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    //密码加密
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/anonymous/**");
    }

    //配置安全拦截机制
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http.csrf().disable()
//                .sessionManagement()   //会话模式，会为每个登录成功的用户会新建一个Session
//                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
               // .authorizeRequests()
                //.antMatchers("/r/r1").hasAuthority("p1")//限制单个权限访问
                //.antMatchers("/r/r2").hasAuthority("p2")
                //.antMatchers("/r/r3").access("hasAuthority('p1') and hasAuthority('p2')")
            //    .antMatchers("/account/clientLogin").permitAll()
//                .antMatchers("/actuator/**").permitAll()
//                .antMatchers("/anonymous/**").permitAll()
//                .antMatchers("/doc.html/**").permitAll()
//                .antMatchers("/webjars/**").permitAll()
//                .antMatchers("/swagger/**").permitAll()
//                .antMatchers("/swagger-resources/**").permitAll()
//                .antMatchers("/v2/**").permitAll()
                //.anyRequest().permitAll()//保护URL，需要用户登录
               // .and()
                //.formLogin().successForwardUrl("/login‐success")
                .formLogin();
                //.and()
                //  一旦退出，会自动跳转到我们自定义的路径，session与SecurityContextHolder都会失效
                //.logout()
                //.logoutUrl("/logout")  //触发退出操作的url
                //.logoutSuccessUrl("/login‐view?logout") //退出之后跳转的url
                //定制的 LogoutSuccessHandler ，用于实现用户退出成功时的处理。如果指定了这个选项那么
                //logoutSuccessUrl() 的设置会被忽略。
                //.logoutSuccessHandler(logoutSuccessHandler)

                //添加一个 LogoutHandler,用于实现用户退出时的清理工作.默认 SecurityContextLogoutHandler 会被添加
                //为最后一个 LogoutHandler
                //.addLogoutHandler(logoutHandler)
                //指定是否在退出时让 HttpSession 无效。 默认设置为 true。
                //如果让logout在GET请求下生效，必须关闭防止CSRF攻击csrf().disable()。如果开启了CSRF，必须使用
                //post方式请求/logout
                //.invalidateHttpSession(true);


        /*
        authenticated() 保护URL，需要用户登录
        permitAll() 指定URL无需保护，一般应用与静态资源文件
        hasRole(String role) 限制单个角色访问，角色将被增加 “ROLE_” .所以”ADMIN” 将和 “ROLE_ADMIN”进行比较.
        hasAuthority(String authority) 限制单个权限访问
        hasAnyRole(String… roles)允许多个角色访问.
        hasAnyAuthority(String… authorities) 允许多个权限访问.
        access(String attribute) 该方法使用 SpEL表达式, 所以可以创建复杂的限制.
        hasIpAddress(String ipaddressExpression) 限制IP地址或子网
        */
    }
}